//
//  main.swift
//  swift初级
//
//  Created by 王京 on 16/1/28.
//  Copyright © 2016年 王京. All rights reserved.
//
//当需要导入类库的时候，使用的语法形式import 类库名，不用再加<>  ""

import Foundation//sdhfkjahksdjfa

//print("hello,gogogo")//刘忠宝你似不似撒
//print("hello,gogogo")//刘忠宝你似不似撒

import Foundation
//print("hello,gogogo")//刘忠宝你似不似撒

print("Hello, World!")//在swift中输出使用print()
//asjhdkj
print("hello,gogogo")//刘忠宝你似不似撒
//aksdf
print("hello,gogogo")

//1.定义常量(let)和变量(var)
//定义一个常量
let myGender = "男"

//myGender = "女"//不能改变，因为是let修饰

//2.定义变量
var carName = "BMW"

carName = "Audio"//能改变，是var修饰

//类型自动推断
//注意：swift中定义的变量或常量的时候，需要标识出变量或者常量的类型，如果不标识类型，会根据初始值自动推断
let name = "Jack"//会自动推断为字符串类型String，由后面的值类型来决定的

let name1:String = "Rose"//此时不会自动推断name1的类型，因为已经显示标识了name1得类型

var age:Int = 10

var result:Float = 99.0

var age1:Int

let age2:Int = 30//如果用let修饰，必须赋上初值，如果用var修饰，可以不用赋初值，但是还是建议赋初值

print(age2)
//可选类型
var age4:Int?//表示当前age4是可选类型，其值可以为空
//swift中所有的类都是结构体

//定义一个字符类型的变量
var char = "A"//当“”中只有一个字符时，表示是字符
//相当于下面一句：
//var char:Character = "A"

var flag:Bool = true //true 、false



//字符串
//（1）创建空串
var str_empty = ""
var str1_empty = String()
//（2）如何判断字符串是空  使用isEmpty
if str_empty.isEmpty{//注意：if 后面的判断条件（表达式、方法等..）的返回值，必须是bool类型的
    
    print("是空串")
    
}

//（3）拼接字符串
var str_url = "http://"
var url = "www.lanou3g.com"
let string = str_url + url
print(string)


//插入式取值,形式  \(变量名)
print("蓝欧官网：\(string)\n")


//（4）获取字符串长度
var str:String = "abc"
print(str.characters.count)


//（5）向字符串中插入值
let mul = 4
//swift中不存在隐式类型转换   强转，类型名(变量名)
let result1 = "\(mul)*2.5 = \(Float(mul)*2.5)"
print(result1)

//（6）字符串比较
let str1 = "xiaoxiao"
let str2 = "dada"

if str1 != str2{
    
    print("两个字符串不相等")
}




//数组（Array）
//swift中数组的特点： 存储的所有数据，①必须都是同一类型的，②可以不是对象类型，可以是基本数据类型
//定义数组变量
var nameArray = ["张三","李四","王五"]//①数组中数据元素的类型是根据后面的值自动推断的,②此时变量（nameArray）的类型会自动推断为数组类型

//            <数组中元素类型>
var nameArray1:Array<String> = ["张三","李四","王五"]



//定义一个空数组
var array = Array<String>()//定义字符串型空数组
var int_array = [Int]()//定义整形空数组

//访问数组中的某个元素   数组名[下标]
print("数组中的第二个元素是\(nameArray[1])")

//向数组中添加一个元素,使用append
var int_arr = [Int]()

int_arr.append(10)
int_arr.append(20)
print(int_arr)

//向数组中的某个位置，插入一个元素
int_arr.insert(30, atIndex: 0)
print(int_arr)

//删除数组中的某个元素
int_arr.removeAtIndex(2)
print(int_arr)

//删除数组中所有元素
int_arr.removeAll()
print(int_arr)





//字典（Dictionary）
//定义一个字典变量
var dictionary:Dictionary<String,Int> = ["a":10,"b":20]

//定义一个空字典
var dictionary1:Dictionary<String,String> = [:]
var dictionary2:Dictionary<String,String> = Dictionary<String,String>()

//向字典中添加一个键值对
dictionary["c"] = 30
print(dictionary)

//修改字典中某个键值对的值
dictionary["a"] = 5
print(dictionary)

//字典中删除一个键值对
dictionary.removeValueForKey("a")
print(dictionary)



//元组
//特点：元组中可以存放多种不同类型的值（对象类型、基本数据类型..）,而且存放的个数可以是多个
//定义一个元组变量
var status = ("蓝欧26班",["iOS","H5"])
var status1:(classname:String,course:Array) = ("蓝欧26班",["iOS","H5"])

//访问元组中的某个元素值
//第一种方式:通过下标
print(status.0)
//第二种方式:通过标注名
print(status1.course)



//循环
//第一种形式
//for(int i = 0  ; i<10 ; i++ )
for var i = 0 ; i<10 ; i++
{
 print(i)
}
//第二种形式
for var number in 1..<10
{
 print(number)
}
//第三种形式
for number in 1...10//...包括10
{
    
}

//while和repeat...while
var i = 5
while i>0
{
    i--
    print(i)
}

repeat{
print("repeat...while")
}while i<0

//使用循环遍历数组
var annimalsArray  = ["cat","dog","pig","tiger"]
for animalName in annimalsArray
{
    print(animalName)
}
//使用循环遍历字典
var dict:Dictionary = ["dog":"🐶","cat":"🐱"]
for (key,value) in dict {
    print("key = \(key),value = \(value)")
}



//分支结构
//if结构
let flag1 = true
if flag1 == true{
    print("flag1 = \(flag1)")
}else{
    print("flag1 = \(flag1)")
}
//switch...case
//特点:switch中实现贯穿效果,使用关键字 fallthtough
let value = 0
switch value{
case 0:print("0")
    fallthrough
case 1:print("1")
    fallthrough
case 2:print("2")
    fallthrough
default:print("other")
}
//特点:case后面可以是一个范围
switch value{
case 0..<10:
    print("所在范围是0..10,不包括10")
case 0...100:
    print("所在范围是0..100,不包括100")
default:
    print("other")
    
}

//特点 :case后面可以定义一个量(let,var修饰都可以) where后面的定义这个量所需要满足的条件
switch value{
    //表示当value的值大于等于0并且小于10时才会去定义i变量,否则不会定义
case var i where value>=0 && value<10:
    i=20
    print(i)
default:
    print("other")
}
//特点case后面可以匹配一个元组
let point = (10,10)
switch point
{
case(_,10):
    print("case1")
case(10,0):
    print("case2")
case (10,10):
    print("case3")
    
default:
    print("other")
    
}










